// /home/user/vibecoding/workspace/avatar-upload/utils/request.js
// 请求工具类，封装axios请求

import axios from 'axios'
import { ElMessage } from 'element-plus'

// 创建axios实例
const service = axios.create({
  baseURL: 'http://localhost:8082',
  withCredentials: true, // 必须开启，否则无法携带 Token 和 Cookie
  timeout: 5000
});

// 请求拦截器：添加token到请求头
service.interceptors.request.use(
  config => {
    const token = localStorage.getItem('token')
    if (token) {
      // 后端要求直接携带token，无需拼接Bearer前缀（根据后端Redis存储逻辑调整）
      config.headers['Authorization'] = token
    }
    return config
  },
  error => {
    console.error('请求错误:', error)
    return Promise.reject(error)
  }
)

// 响应拦截器：适配后端Result返回格式
service.interceptors.response.use(
  response => {
    const res = response.data
    console.log('接口响应数据:', res)

    // 后端Result对象规则：成功返回{data: ...}，失败返回{msg: ...}
    if (res.data !== undefined) {
      // 成功时返回完整Result对象，前端使用时取res.data
      return res
    } else {
      // 失败时显示错误信息
      ElMessage.error(res.msg || '操作失败')

      // 未登录/Token失效：拦截并跳转登录页
      if (res.msg && res.msg.includes('未登录')) {
        localStorage.removeItem('token')
        localStorage.removeItem('userInfo')
        window.location.href = '/login'
      }
      return Promise.reject(new Error(res.msg || '请求失败'))
    }
  },
  error => {
    console.error('响应错误详情:', error)

    // HTTP状态码处理
    if (error.response) {
      switch (error.response.status) {
        case 401:
          ElMessage.error('身份已过期，请重新登录')
          localStorage.removeItem('token')
          localStorage.removeItem('userInfo')
          window.location.href = '/login'
          break
        case 403:
          ElMessage.error('无权限执行此操作')
          break
        case 404:
          ElMessage.error('请求的接口不存在')
          break
        case 500:
          ElMessage.error('服务器内部错误，请稍后重试')
          break
        default:
          ElMessage.error(`请求错误[${error.response.status}]`)
      }
    } else {
      ElMessage.error('网络连接失败，请检查网络')
    }

    return Promise.reject(error)
  }
)

export default service
